#ifndef LECTEURPHRASESIMPLE_H_
#define LECTEURPHRASESIMPLE_H_

#include "LecteurSymbole.h"

class LecteurPhraseSimple {

        public:
                LecteurPhraseSimple(string nomFich);
                // Construit un lecteur de phrase pour vérifier la syntaxe du programme dans le fichier nomFich

                void analyse();
                // Si le contenu du fichier est conforme à la grammaire, cette 
                // méthode se termine normalement et affiche un message "Syntaxe correcte".
                // Sinon, le programme sera interrompu (exit).
        	
        private:
                LecteurSymbole ls;
                // le lecteur de symboles utilisé pour lyser le fichier	
                

//------------------------Implémentation de la grammaire----------------------//
    
        void programme();       // <programme>  ::= debut <seqInst> fin <EOF>
        void seqInst();         // <seq_ins>    ::= <inst> ; { <inst> ; }
        void inst();            // <inst>       ::= <affectation> | <instSi> | <instTq> | <instRepeter>
        void instSi();          // <instSi>     ::= si ( <expBool> ) <seqInst> { sinonsi ( <expBool> ) <seqInst> } [ sinon <seqInst> ] finsi
        void instTq();          // <instTq>     ::= tantque ( <expBool> ) <seqInst> fintantque
        void instRepeter();     // <instRepeter>::= repeter <seqInst> jusqua ( <expBool> )
        void instLire();        // <instLire>   ::= lire ( <variable>)  
        void instEcrire();      // <instEcrire> ::= ecrire ( <expression> | <chaine>)   
        void instPour();        // <instPour>   ::= pour ( affectation ; <expBoolOU>; affectation ) <seqInst> finpour

        void affectation();     // <affectation>::= <variable> = <expression>
        void expression();      // <expression> ::= <terme> { <opBinaire> <facteur> }
        void terme();           // <terme>      ::= <facteur> { <opMult> <facteur> }
        void facteur();         // <facteur>    ::= <entier>  |  <variable>  |  <opUnaire> <expBool>  |  ( <expBool> )
    
    //------------------------------- Priorités --------------------------------

        void opAdd();           // <opAdd>      ::= + | -
        void opMult();          // <opMult>     ::= * | /
    
    //------------------------- Expressions booléennes -------------------------
    
        void expBoolET();         // <expBoolET>    ::= <relation> { <opBoolET> <relation> }
        void expBoolOU();         // <expBoolOU>    ::= <relation> { <opBoolOU> <relation> }      
        void opBoolOU();          // <opBool>     ::= ou
        void opBoolET();        // <opBool>     ::= et
        void relation();        // <relation>   ::= <expression> {<opRel> <expression>}
        void opRel();           // <opRel>      ::= == | != | < | <= | > | >=
        void opUnaire();        // <opUnaire>   ::= - | non
    
    //--------------- Outils pour simplifier l'analyse syntaxique --------------
    
        void testerSymCour (string ch); // si symbole courant != ch, erreur : on arrete le programme, sinon rien
        void sauterSymCour (string ch); // si symbole courant == ch, on passe au symbole suivant, sinon erreur : on arrete
        void erreur (string mess);      // affiche les message d'erreur mess et arrete le programme

};

#endif /* LECTEURPHRASESIMPLE_H_ */